home *** CD-ROM | disk | FTP | other *** search
- OPT OSVERSION=37,REG=5
-
- MODULE 'exec/memory'
-
- PROC main()
- DEF myargs:PTR TO LONG,rdargs,fi,fo,mem:PTR TO CHAR,length,count
- DEF out[256]:STRING
- myargs:=[0,0,0,0,0]
- IF rdargs:=ReadArgs('NAME/A,TO/K,REPLACE/A,WHAT,QUIET/S',myargs,NIL)
- IF myargs[4]=FALSE THEN WriteF('Replace v1.0 (\s/\s)\n',myargs[2],IF myargs[3] THEN myargs[3] ELSE 'NIL')
- length:=FileLength(myargs[0])
- IF mem:=AllocVec(length,MEMF_PUBLIC)
- IF fi:=Open(myargs[0],OLDFILE)
- Read(fi,mem,length)
- count:=xReplace(mem,myargs[2],myargs[3],length)
- IF myargs[1] THEN StrCopy(out,myargs[1]) ELSE StringF(out,'\s.new',myargs[0])
- IF fo:=Open(out,NEWFILE)
- Write(fo,mem,length)
- Close(fo)
- ELSE
- IF myargs[4]=FALSE THEN WriteF('Unable to open file: "\s"\n',out)
- ENDIF
- Close(fi)
- IF myargs[4]=FALSE THEN WriteF('Changes: \d\n',count);
- ELSE
- IF myargs[4]=FALSE THEN WriteF('Unable to open file: "\s"\n',myargs[0])
- ENDIF
- FreeVec(mem)
- ELSE
- IF myargs[4]=FALSE THEN WriteF('Not Enough memory!\n')
- ENDIF
- FreeArgs(rdargs)
- ELSE
- PrintFault(IoErr(),'Replace')
- ENDIF
- ENDPROC
-
- PROC xReplace(mem:PTR TO CHAR,s1:PTR TO CHAR,s2:PTR TO CHAR,length)
- DEF pos=0,count=0,s2l,i
- WHILE pos<length
- pos:=xFind(s1,mem,pos,length)
- IF pos=TRUE THEN RETURN count
- IF pos<length
- IF s2
- s2l:=StrLen(s2)
- i:=0
- WHILE i<s2l
- mem[pos]:=s2[i]
- i++
- pos++
- IF CtrlC() THEN RETURN
- ENDWHILE
- count++
- ELSE
- s2l:=StrLen(s1)
- WHILE s2l
- mem[pos]:=0
- pos++
- s2l--
- ENDWHILE
- count++
- ENDIF
- ENDIF
- IF CtrlC() THEN RETURN
- ENDWHILE
- ENDPROC count
-
- PROC xFind(s1:PTR TO CHAR,mem:PTR TO CHAR,pos,length)
- REPEAT
- REPEAT
- IF CtrlC() THEN RETURN
- pos++
- IF pos>length THEN RETURN TRUE
- UNTIL mem[pos]=s1[0]
- UNTIL StrCmp(s1,mem+pos,StrLen(s1))=TRUE
- ENDPROC pos
-